<?php
/**
 * @OA\Info(
 *     title="纸条盲盒系统 API",
 *     version="1.0.0",
 *     description="纸条盲盒系统接口文档",
 *     @OA\Contact(
 *         email="admin@example.com",
 *         name="API Support"
 *     )
 * )
 * 
 * @OA\Tag(name="Auth", description="身份验证")
 * @OA\Tag(name="User", description="用户管理")
 * @OA\Tag(name="Note", description="纸条管理") 
 * @OA\Tag(name="System", description="系统设置")
 *
 * @OA\Schema(
 *     schema="ApiResponse",
 *     required={"code", "message", "data"},
 *     @OA\Property(property="code", type="integer", example=0, description="状态码：0成功，非0失败"),
 *     @OA\Property(property="message", type="string", example="操作成功", description="状态信息"),
 *     @OA\Property(property="data", type="object", description="数据对象")
 * )
 *
 * @OA\Schema(
 *     schema="SuccessResponse",
 *     required={"code", "message", "data"},
 *     @OA\Property(property="code", type="integer", example=0, description="状态码：0成功"),
 *     @OA\Property(property="message", type="string", example="操作成功", description="状态信息"),
 *     @OA\Property(property="data", type="object", description="数据对象")
 * )
 * 
 * @OA\Schema(
 *     schema="ErrorResponse",
 *     required={"code", "message", "data"},
 *     @OA\Property(property="code", type="integer", example=1, description="状态码：非0表示失败"),
 *     @OA\Property(property="message", type="string", example="操作失败", description="错误信息"),
 *     @OA\Property(property="data", type="object", description="空数据对象")
 * )
 *
 * @OA\Parameter(
 *     parameter="Authorization",
 *     name="Authorization",
 *     in="header",
 *     description="登录令牌",
 *     required=true,
 *     @OA\Schema(type="string")
 * )
 */

declare (strict_types = 1);

namespace app\controller;

use app\BaseController;
use think\App;
use think\Response;

/**
 * API基础控制器
 */
abstract class ApiBaseController extends BaseController
{
    /**
     * 当前登录用户
     * @var \app\model\User
     */
    protected $user = null;
    
    /**
     * 构造方法
     * @access public
     * @param  App  $app  应用对象
     */
    public function __construct(App $app)
    {
        parent::__construct($app);
        
        // 获取用户ID，尝试多种方式
        $userId = null;
        
        // 从 session 获取
        if (session('?user_id')) {
            $userId = session('user_id');
            trace("从session获取用户ID: {$userId}", 'debug');
        }
        // 从请求对象获取
        else if (isset($this->request->userId)) {
            $userId = $this->request->userId;
            trace("从控制器request对象获取用户ID: {$userId}", 'debug');
        }
        // 从全局单例请求对象获取
        else if (isset(request()->userId)) {
            $userId = request()->userId;
            trace("从全局request对象获取用户ID: {$userId}", 'debug');
        }
        // 从容器获取
        else if (app()->has('user_id')) {
            $userId = app()->get('user_id');
            trace("从容器获取用户ID: {$userId}", 'debug');
        }
        
        // 根据用户ID查询用户
        if ($userId) {
            // 查询用户信息
            $this->user = \app\model\User::where('id', $userId)->find();
            if ($this->user) {
                trace("成功根据ID {$userId} 获取用户", 'debug');
            } else {
                trace("根据ID {$userId} 未找到用户", 'error');
            }
        } else {
            trace("无法获取用户ID", 'error');
        }
    }
    
    /**
     * 获取当前用户
     * 如果用户不存在，会返回null
     * 
     * @return \app\model\User|null
     */
    protected function getCurrentUser()
    {
        // 如果用户已加载，直接返回
        if ($this->user) {
            return $this->user;
        }
        
        // 尝试从session获取用户ID
        $userId = session('user_id');
        if (!$userId) {
            return null;
        }
        
        // 根据ID查询用户
        $user = \app\model\User::where('id', $userId)->find();
        if ($user) {
            // 缓存用户对象
            $this->user = $user;
        }
        
        return $user;
    }
    
    /**
     * 验证用户是否已登录
     */
    protected function checkLogin()
    {
        if (!$this->user) {
            // 尝试重新获取用户
            $this->user = $this->getCurrentUser();
            
            if (!$this->user) {
                return $this->error('请先登录', 401);
            }
        }
        
        return true;
    }
    
    /**
     * 验证用户是否为指定代理等级
     *
     * @param int $level 代理等级
     * @return bool|Response
     */
    protected function checkAgentLevel(int $level)
    {
        if ($this->user->agent_level < $level) {
            return $this->error('您的代理等级不满足要求', 403);
        }
        
        return true;
    }
    
    /**
     * 获取分页参数
     *
     * @return array
     */
    protected function getPaginate()
    {
        $page = $this->request->param('page/d', 1);
        $limit = $this->request->param('limit/d', 10);
        
        // 限制最大分页数量
        $limit = min($limit, 100);
        
        return [$page, $limit];
    }
    
    /**
     * 返回成功响应
     *
     * @param array|object $data 响应数据
     * @param string $message 响应信息
     * @param int $code 响应码
     * @return Response
     */
    protected function success($data = [], string $message = '操作成功', int $code = 200): Response
    {
        return json([
            'code' => $code,
            'msg' => $message,
            'data' => $data
        ]);
    }
    
    /**
     * 返回错误响应
     *
     * @param string $message 错误信息
     * @param int $code 错误码
     * @param mixed $data 额外数据
     * @return Response
     */
    protected function error(string $message = '操作失败', int $code = 400, $data = []): Response
    {
        return json([
            'code' => $code,
            'msg' => $message,
            'data' => $data
        ]);
    }
} 